package furns.web;

import com.google.gson.Gson;
import furns.entity.Member;
import furns.service.MemberService;
import furns.service.impl.MemberServiceImpl;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import static com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY;

//该servlet 用于处理会员模块的请求
@SuppressWarnings("all")
@WebServlet(name = "MemberServlet", urlPatterns = "/memberServlet")
public class MemberServlet extends BasicServlet {
    //创建一个memberService对象,便于调用其方法
    private MemberService memberService = new MemberServiceImpl();

//    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        doPost(request, response);
//    }


    //    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        //获取表单中的 name = "action" 的值
//        String action = request.getParameter("action");
//        if ("register".equals(action)) {
//            register(request, response);
//        } else if ("login".equals(action)) {
//            login(request, response);
//        } else {
//            response.getWriter().write("登录信息有误！！！");
//        }
//    }
    //处理会员登录
    protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        System.out.println("LoginServlet 被调用");
        //获取用户输入的用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        Member member = memberService.login(new Member(null, username, password, null));//返回db中的member对象
        if (member == null) {  //说明数据库中没有该member信息，因此无法登录
            //登录失败，跳转到登录页面，并提示用户名或密码错误
            //将提示信息保存到request域中。因为是请求转发，因此是同一个request对象
            request.setAttribute("msg", "用户名或密码错误");
            //密码错误，将用户输入的用户名保存到request域中并显示在登录页面中
            request.setAttribute("username", username);
            request.getRequestDispatcher("/views/member/login.jsp").forward(request, response);
        } else {
            //将member对象保存到session中
            request.getSession().setAttribute("member", member);
            //表示数据库中存在用户输入的数据，因此登录成功
            request.getRequestDispatcher("/views/member/login_ok.jsp").forward(request, response);
        }
    }

    //处理会员注册
    protected void register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        System.out.println("RegisterServlet被调用");
        //接收用户输入的注册信息
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String email = request.getParameter("email");
        //获取用户输入的验证码
        String code = request.getParameter("code");
        //从session中获取真正的验证码
        String token = (String) request.getSession().getAttribute(KAPTCHA_SESSION_KEY);
        //使用完该验证码后，立即删除。防止该验证码被重复使用
        request.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
        //只有当验证码输入正确，才进行后续操作
        if (token != null && token.equalsIgnoreCase(code)) {
            //判断用户名是否可用
            if (!memberService.isExistsUsername(username)) { //表示用户名可用，然后进行后续注册
                //构建一个member对象用于封装注册信息
                Member member = new Member(null, username, password, email);
                if (memberService.registerMember(member)) { //即 将用户输入的注册信息保存到 db中
                    //注册成功后，转发到指定页面。
                    //路径中的第一个 / 会被服务器解析成 http://ip:port/工程名/
                    request.getRequestDispatcher("/views/member/register_ok.jsp").forward(request, response);
                } else {
                    //注册失败后，转发到指定页面
                    request.getRequestDispatcher("/views/member/register_fail.jsp").forward(request, response);
                }
            } else { //表示用户名不可用
                //提示用户名不可用
//                request.setAttribute("msg", "用户名不可用");
                //跳转到登录页面
                request.getRequestDispatcher("/views/member/login.jsp").forward(request, response);
            }
        } else {
            request.setAttribute("msg", "验证码错误");
            //将输入的用户名和邮箱进行回显
            request.setAttribute("username", username);
            request.setAttribute("email", email);
            //带回一个消息，表示要显示到注册的页面
            request.setAttribute("active", "register");
            request.getRequestDispatcher("/views/member/login.jsp").forward(request, response);
        }

    }

    //处理会员退出
    protected void logout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //销毁当前用户的session
        request.getSession().invalidate();
        //重定向到首页 ----> request.getContextPath() ==> http://localhost:8080/jiaju_mall  会默认访问index.jsp文件
        response.sendRedirect(request.getContextPath());
    }

    //验证某个用户名是否在数据库中
    protected void isExistUsername(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、获取用户名
        String username = request.getParameter("username");
        //2、调用memberService中的方法，判断用户名是否可用
        boolean isExistUsername = memberService.isExistsUsername(username);
        //3、将结果转换为json格式，响应给客户端。---->需要根据前端的需求返回对应的json格式数据
        //方式一：最简单的拼接方式
//        String resultJson = "{\"isExist\":" + isExistUsername + "}";
        //方式二：将待返回的数据放入 map集合中，然后调用工具类中的方法，将map集合转换为json格式数据。
        //       该方式更灵活，可以通过put()方法灵活的进行添加数据
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("isExist", isExistUsername);
        //创建一个gson对象,作为工具类使用
        Gson gson = new Gson();
        String resultJson = gson.toJson(resultMap);
        //4、将json格式数据响应给客户端
        response.getWriter().write(resultJson);
    }
}